package com.yin.myproject;

import java.lang.reflect.Constructor;

/**
 * Class对象:构造函数相关API
 *
 * @author Eason
 * @create 2018-03-30 15:00
 **/
public class ClassAPIForConstructor {

    public static void main(String[] args) {
        //通过getClass对象的方式获取Class对象
        UserForReflection user = new UserForReflection();
        Class<? extends UserForReflection> clazz = user.getClass();

        //获取所有的构造函数:但是不包括私有的构造函数
        Constructor<?>[] constructors = clazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("构造函数名称: " + constructor.getName() + ",构造函数参数个数:" + constructor.getParameterCount());
        }

        System.out.println("===================================================================================================");

        try {
            //根据参数类型获取构造函数:同样不能获取私有的构造函数
            Constructor<? extends UserForReflection> constructor = clazz.getConstructor(Integer.class, String.class, String.class);
            System.out.println("构造函数名称: " + constructor.getName() + ",构造函数参数个数:" + constructor.getParameterCount());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        System.out.println("===================================================================================================");
        try {
            //不能获取私有的构造函数,
            Constructor<? extends UserForReflection> constructor = clazz.getConstructor(Integer.class, String.class);
            System.out.println("构造函数名称: " + constructor.getName() + ",构造函数参数个数:" + constructor.getParameterCount());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        System.out.println("===================================================================================================");

        //获取所有的构造函数:但是不包括私有的构造函数
        Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : declaredConstructors) {
            System.out.println("构造函数名称: " + constructor.getName() + ",构造函数参数个数:" + constructor.getParameterCount());
        }


        System.out.println("===================================================================================================");

        try {
            //根据参数类型获取构造函数:可以获取私有的构造函数
            Constructor<? extends UserForReflection> constructor = clazz.getDeclaredConstructor(Integer.class, String.class, String.class);
            System.out.println("构造函数名称: " + constructor.getName() + ",构造函数参数个数:" + constructor.getParameterCount());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

}
